void* data 数据类型参数以及void *data[ ]解释

您所在的位置:网站首页 voiditem user 88818817 void* data 数据类型参数以及void *data[ ]解释

void* data 数据类型参数以及void *data[ ]解释

#void* data 数据类型参数以及void *data[ ]解释| 来源: 网络整理| 查看: 265

文章目录 一、void 的作用二、void 指针的使用规则三、代码示例

void 在英文中作为名词的解释为 “空虚、空间、空隙”,而在 C 语言中,void 被翻译为"无类型",相应的void * 为"无类型指针"。

void * 似乎只有"注释"和限制程序的作用,当然,这里的"注释"不是为我们人提供注释,而是为编译器提供一种所谓的注释。

void data[ ]是个什么鬼?

1、先来解决形如 type name[ ]的问题。这里有一个比较实在的推断方法

int buf[48],指的是一个数组有48个元素,每个元素都是int类型

char buf[48],指的是一个数组有48个元素,每个元素都是int类型

需要注意先表述元素个数再表述元素类型,这么表述的情况下就会容易理解数组里带指针的情况:

int *buf[48],指的是一个数组有48个元素,每个元素都是int类型,因此这个是包含有48个int 类型数据的数组;

char *buf[48],指的是一个数组有48个元素,每个元素都是char*类型,因此这个是包含有48个char *类型数据的数组;

由此我们就能知道, 对于void *data[ ] ,我们先分析[ ],再分析void *,可知,这个是包含了若干个void *类型的数组。

为什么说是若干,因为[ ]里面未指定具体的数字。我们在定义数组时有这么一种定义形式,如 int buf[ ] ={0,1,2,3,4};

如果[ ]里不指定具体的大小,则大小由实际赋值的内容决定,这种通配的形式会比较灵活。

这么来解答这个问题是不是有点耍流氓,其实还有理论基础的:在运算符的优先级中,[ ]运算符的优先级是处于第一级的,而运算符作为一元运算符时,优先级处于第二级,作为乘法运算符时,处于第四级,[ ]的优先级高于,因此在和[ ]同时出现时,我们应该先考虑[],再考虑,上述推断的方法也只是提供了一个方便记忆的方法;

2 、有关void 类型的困惑

确定了void *data[ ]是一个包含由若干个void *指针的元素的数组外,又有了新的问题,那么void *又是个什么鬼?

从多方查阅资料得知:void *有如下的特性:

void指针是一种没有类型的指针。

任何指针都可以赋值给void指针。

void指针转换为其他指针时需要进行类型转换。

void指针由于不确定类型不能解引用。

因此,可以这么说,void *的存在就是为了通配各种参数类型的,如果在一个函数的参数列表中有个void *的参数,那么给它传入任何类型的指针参数都是正确的。

3、引发血案的罪魁祸首

那么void*也讲清了,那么参数列表中出现void *data[ ]时,到底该传入什么参数呢?

来讨论下如下的函数场景。

void func1(void *_data0[ ]);

然后有一个int类型的数组: int data[10]={0};

如何给这个函数传参呢?我们都知道数组名data代表数组的首元素data[0]的地址,data本身是一个指针,那么我们传入的方式是下面的形式吗?

func1(data);

如果是这么传入参数的话,那么如果有一个如下的函数原型

void func1(void * _data0);

这个该怎么传入数据呢?还是func1(data)吗?

如果照这么说,那么 void func1(void *data0[ ]) 和 void func1(void *data0)是等价的吗?

一时没有搞清楚,到底是不是一样的呢,于是简单的写了如下的测试代码看了下效果:

#include #include #include char a[12] = {0,1,2,3,4,5,6,7,8,9,10,11}; void function1(void *data,int length) { char tmp[12] = {0}; memcpy(tmp,data,length); for(int i = 0 ; i 0}; memcpy(tmp,data,length); for(int i = 0 ; i 0}; memcpy(tmp,data,length); for(int i = 0 ; i int c; c=*((int*)a)+*((int*)b); return c; } int _tmain(int argc, _TCHAR* argv[]) { int a=1,b=2; int sum; sum=add(&a,&b); cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3